package queue;


/**
 * 1.队列 先进先出，先来先买 后面得人只能等着
 * 2.基本操作： 入队push， 出队pop(), 且入栈出栈操作都在栈顶进行。
 * 3.队列跟栈一样，也是一种操作受限的线性表数据结构。
 * 链表实现队列
 */
class Node_1<node> {
    Node_1<node> next = null;
    node data;

    public Node_1(node data) {
        this.data = data;
    }
}

public class AchieveQueueOfLinkList<node> {


    private Node_1<node> head = null;
    private Node_1<node> tail = null;

    //判断是否为空
    public boolean isEmpty() {
        return tail == head;
    }

    //进队
    public void push(node data) {
        Node_1<node> newNode = new Node_1<>(data);
        if (head == null && tail == null)//判断队列是否为空 若不判断 则编译不过 空指针异常
            head = tail = newNode;
        else {
            //把当前队尾指针指向newnode 并把newNode赋值给tail。
            tail.next = newNode;
            tail = newNode;
        }
    }

    //出队
    public node pop() {
        if (this.isEmpty())
            return null;
        //当前队头数据赋值给node  并把head指向 赋值给新的head 返回node 即出队的数据
        node data = head.data;
        head = head.next;
        return data;
    }

    //队首的数据
    public node peek() {
        return head.data;
    }

    public static void main(String[] args) {
        AchieveQueueOfLinkList<Integer> myqueue = new AchieveQueueOfLinkList<>();
        myqueue.push(122);
        myqueue.push(144);
        myqueue.push(155);
        myqueue.pop();
        System.out.print(myqueue.peek());//122

    }
}
